﻿Imports Microsoft.DirectX
Imports Microsoft.DirectX.Direct3D
Imports Commander_Wars.Spieletools
''' <summary>
''' Dieses Menue zeichnet den Siegbildschirm und alles was dazu gehoert
''' </summary>
''' <remarks></remarks>
Public Class ObjektSiegMenue
    Inherits ObjektFormMenue
    Enum AufzeichnungsTypen
        Fonds
        Einkommen
        Basen
        Einheiten
        Spielerstaerke
        Sieger
        Sonstiges
    End Enum
    Shared Farbtabellen As Color() = {}
    Dim Tage As Integer
    Dim Grafiken(4) As Grafik
    Public SpecialEventTexturs As New List(Of Texture)
    Dim AktuelleGrafik As AufzeichnungsTypen
    Dim LandschaftenInfo As ObjektLandkartenInfos
    Dim NaechsteKarte As String
    Dim DieseKarte As String
    Shared BesondereEreignisse As BesonderesEreigniss() = {}
    Dim MitSpieler As ObjektSpieler() = {}
    Dim SiegTexte(,) As Integer = {}
    Dim SiegerTeam As Char = "q"
    Dim Text As ObjektText
    Dim RankPunkte As Vector3() = {}
    Dim RankTimer As Integer = 0
    Dim CBBoxes As New List(Of ObjektCheckBox)
    Public Sub New(ByVal Aufzeichnung As ObjektAufzeichnungen, ByVal SpielerFarbtabellen As Color(), ByVal LandschaftenInfo As ObjektLandkartenInfos, ByVal NaechsteKarte As String, ByVal Spieler As ObjektSpieler())
        If Hauptmenue.Connection IsNot Nothing Then
            Hauptmenue.Connection.Close(False)
            Hauptmenue.Connection = Nothing
            Hauptmenue.Connection = New GameConnection
        End If
        Konsole.ShowScript = False
        If DataSettings.KonsolenSpielBefehle Then
            Konsole.Write("Game Ended, start showing Victory Menu")
        End If
        Me.LandschaftenInfo = LandschaftenInfo
        Me.MitSpieler = Spieler
        Me.NaechsteKarte = NaechsteKarte
        Me.DieseKarte = Objektverwalter.Spielfeld.DieseKarte
        Farbtabellen = SpielerFarbtabellen
        'Wir legen die laenge der Aufzeichnung fest
        If Not Aufzeichnung.Aufzeichnungen(Aufzeichnung.Aufzeichnungen.Length - 1).SpielerAufzeichnungen(0, 0) Is Nothing Then
            Tage = Aufzeichnung.Aufzeichnungen(Aufzeichnung.Aufzeichnungen.Length - 1).SpielerAufzeichnungen(0, 0).Tag
        Else
            Tage = Aufzeichnung.Aufzeichnungen(Aufzeichnung.Aufzeichnungen.Length - 2).SpielerAufzeichnungen(0, 0).Tag
        End If
        BesondereEreignisse = Aufzeichnung.BesondereEreignisse
        'Diese Schlacht hat ein Spieler gewonnen.
        If Objektverwalter.Spielfeld.Regeln.Spielende = True Then

            For I = 1 To Objektverwalter.Spielfeld.Regeln.Besiegt.Length - 1
                If Objektverwalter.Spielfeld.Regeln.Besiegt(I) = False Then
                    SiegerTeam = Spieler(I).Team
                End If
            Next
        End If
        If Hauptmenue.AufzeichnungAktiv Then
            'So mal sehen
            If Objektverwalter.Spielfeld.Regeln.Spielende = True Then
                'We have won this Map
                Dim File As String = DataSettings.Resourcenpfad + "Record\" + Objektverwalter.Spielfeld.Kartenname
                If My.Computer.FileSystem.FileExists(File + ".rpl") Then
                    Dim I As Integer = 0
                    While My.Computer.FileSystem.FileExists(File + "+" + I.ToString + ".rpl")
                        I += 1
                    End While
                    File += "+" + I.ToString
                End If
                Hauptmenue.AufzeichnungEnde(File + ".rpl")
            Else
                Hauptmenue.AufzeichnungAbbrechen()
            End If
        Else
            Hauptmenue.AufzeichnungAbspielenThreadBeenden()
        End If
        AktuelleGrafik = AufzeichnungsTypen.Fonds

        Grafiken(0) = New Grafik(AufzeichnungsTypen.Fonds, Aufzeichnung)
        Grafiken(1) = New Grafik(AufzeichnungsTypen.Einkommen, Aufzeichnung)
        Grafiken(2) = New Grafik(AufzeichnungsTypen.Basen, Aufzeichnung)
        Grafiken(3) = New Grafik(AufzeichnungsTypen.Einheiten, Aufzeichnung)
        Grafiken(4) = New Grafik(AufzeichnungsTypen.Spielerstaerke, Aufzeichnung)

        SpecialEventTexturs.Add(Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Gabe.png"))
        SpecialEventTexturs.Add(Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\SpezialGabe.png"))
        SpecialEventTexturs.Add(Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Doppelgabe.png"))
        SpecialEventTexturs.Add(Grafikengine.LoadTexture(Grafikengine.Bildveraendern(Image.FromFile(DataSettings.Resourcenpfad + "Menu Icons\HQ+Eroberung.png"), My.Resources.Neutral, 0, 0, Hauptmenue.Farbtabelleerstellen(Farbtabellen(0)))))
        SpecialEventTexturs.Add(Grafikengine.LoadTexture(Grafikengine.Bildveraendern(Image.FromFile(DataSettings.Resourcenpfad + "Menu Icons\HQ+Eroberung.png"), My.Resources.Neutral, 0, 0, Hauptmenue.Farbtabelleerstellen(Farbtabellen(0)))))
        SpecialEventTexturs.Add(Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Niederlage.png"))


        Dim P As New ObjektPanel2D(New Rectangle(0, DataSettings.BildschirmHoehe - 70, DataSettings.BildschirmBreite, 70), New PointF(1, 1), 5, False)
        Dim X As Integer = 20
        NeuButton(X, 20, DataSettings.Resourcenpfad + "Objects\Button.png", "Fonds", New PointF(0, 0), , , , P)
        X += 120
        NeuButton(X, 20, DataSettings.Resourcenpfad + "Objects\Button.png", "Einkommen", New PointF(0, 0), , , , P)
        X += 120
        NeuButton(X, 20, DataSettings.Resourcenpfad + "Objects\Button.png", "Basen", New PointF(0, 0), , , , P)
        X += 120
        NeuButton(X, 20, DataSettings.Resourcenpfad + "Objects\Button.png", "Einheiten", New PointF(0, 0), , , , P)
        X += 120
        NeuButton(X, 20, DataSettings.Resourcenpfad + "Objects\Button.png", "Spielerstaerke", New PointF(0, 0), , , , P)
        X += 120
        Dim MoneyEarned As Boolean = False
        If SiegerTeam <> "q" Then
            NeuButton(X, 20, DataSettings.Resourcenpfad + "Objects\Button.png", "Sieger", New PointF(0, 0), , , , P)
            X += 120
            Text = New ObjektText(New String() {}, 0, 0, Nothing, Schriftengine.Schriftarten.Arial, 12, FontStyle.Regular)
            ReDim SiegTexte(Spieler.Length - 1, 1)
            ReDim RankPunkte(Spieler.Length - 2)
            For I = 0 To Spieler.Length - 1
                SiegTexte(I, 0) = -1
                SiegTexte(I, 1) = -1
                If Spieler(I).Team = SiegerTeam Then
                    For I2 = 0 To 1
                        If Not Spieler(I).KOS(I2) Is Nothing Then
                            SiegTexte(I, I2) = (Zufallszahl(0, Objektverwalter.GetKO(Spieler(I).KOS(I2).Bild).KOBeschreibung.Siegsaetze.Length - 1))
                        End If

                    Next
                Else
                    For I2 = 0 To 1
                        If Not Spieler(I).KOS(I2) Is Nothing Then
                            SiegTexte(I, I2) = (Zufallszahl(0, Objektverwalter.GetKO(Spieler(I).KOS(I2).Bild).KOBeschreibung.Niederlagesaetze.Length - 1))
                        End If
                    Next
                End If
                If I > 0 Then
                    Aufzeichnung.CalculateRang(Objektverwalter.Spielfeld, I, RankPunkte(I - 1))
                    If Objektverwalter.Spielfeld.Spieler(I).KIStufe = ObjektSpieler.KIStufen.Mensch And Not MoneyEarned Then
                        Hauptmenue.User.Money += CInt(RankPunkte(I - 1).X + RankPunkte(I - 1).Y + RankPunkte(I - 1).Z)
                        MoneyEarned = True
                    End If
                End If
            Next
            NeuButton(X, 20, DataSettings.Resourcenpfad + "Objects\Button.png", "Sonstiges", New PointF(0, 0), , , , P)
            X += 120
        End If

        NeuButton(X, 20, DataSettings.Resourcenpfad + "Objects\Button.png", "Weiter", New PointF(0, 0), , , , P)
        X += 120

        NeuPanel(P)

        Dim P1 As New ObjektPanel2D(New Rectangle(0, 0, 200, DataSettings.BildschirmHoehe - 70), New PointF(0, 0), 6, False)

        For I = 1 To Spieler.Length - 1
            NeuLabel(5, 105 + 30 * (I - 1), New String() {Spieler(I).Spielername}, New PointF, P1)
            CBBoxes.Add(New ObjektCheckBox(New Point(150, 105 + 30 * (I - 1)), "CheckBox", New PointF, True, P1))
        Next

        NeuPanel(P1)
    End Sub
    Public Overrides Sub ChangeWindowSize(ByVal PosChange As System.Drawing.Point)
        MyBase.ChangeWindowSizeObjekte(PosChange)
        For Each Graf In Grafiken
            Graf.UpdateGrafSize()
        Next
    End Sub

    Public Overrides Sub Frame()

    End Sub

    Public Overrides Sub IniMenue()
        If DataSettings.Verhaeltnis = Hauptmenue.Breitbild Then
            Objektverwalter.LoadHintergrund(DataSettings.Resourcenpfad + "Backgrounds\SiegMenueGross.png")
        Else
            Objektverwalter.LoadHintergrund(DataSettings.Resourcenpfad + "Backgrounds\SiegMenue.png")
        End If

    End Sub

    Public Overrides Sub KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)

        Select Case e.KeyCode
            Case Keys.Escape
                StatistikenBeenden()
            Case DataSettings.Bestaetigen
                GrafikfertigMalen()
        End Select
    End Sub
    Private Sub GrafikfertigMalen()
        If Grafiken.Length > AktuelleGrafik Then
            Grafiken(AktuelleGrafik).FertigMalen = True
        End If
    End Sub

    Private Function SiegDurchMensch() As Boolean
        For Each S In MitSpieler
            If S.KIStufe = ObjektSpieler.KIStufen.Mensch Then
                If S.Team = SiegerTeam Then
                    Return True
                End If
            End If
        Next
        Return False
    End Function

    Public Sub StatistikenBeenden()
        Reset()
        Dim nKarte As String = NaechsteKarte
        If IsNothing(nKarte) Then nKarte = ""
        If nKarte <> "" Then
            'Also gut es gibt eine Folgekarte. (Im Moment auch wenn man verloren hat. Den Bug kann man spaeter noch mit einer eleganten if-Anweisung beseitigen.
            Hauptmenue.Ini(Hauptmenue.Formmodi.Kartenauswahl) 'Wir gehen in die Kartenauswahl und ...

            '...legen die Karte fest (Auch wenn man sie bisher noch nicht auswaehlen konnte.
            Dim M As ObjektKartenauswahlMenue
            If TypeOf Objektverwalter.Menue Is ObjektKartenauswahlMenue Then

                'Diese Bedingung muesste EIGENTLICH immer erfuellt sein.
                M = Objektverwalter.Menue
                M.Overworld = LandschaftenInfo
                M.AllowMapBrowsing = False
                M.ResetKartenAuswahl()
                M.KartenAuswahlErstellen()
                ObjektKartenauswahlMenue.MomentaneKarte = 0 'OK, jetzt muss ich alles "von Hand" laden. Eigentlich unnoetig, da dem Spieler gestattet wird selbst eine Karte auszuwaehlen. Auch wenn es nicht besonderes viele Alternativen gibt. :)
                Dim Karten() As String = {DieseKarte}
                If SiegerTeam <> "q" Then
                    Karten = nKarte.Split("|")
                End If

                Array.Resize(M.SpielKarten, Karten.Length) 'Es gibt ja dann nur eine Karte zum auswaehlen :)
                Array.Resize(M.Kartenname, Karten.Length) 'Der Pfad , Endung und so.
                Array.Resize(ObjektKartenauswahlMenue.KartenNamen, Karten.Length) 'Der Name der im Spiel auftaucht.

                'Array.Resize(M.Kartenauswahl.AngezeigteKarten, 1)
                ObjektKartenauswahlMenue.AngezeigteKarten(0) = 0
                For I = 0 To ObjektKartenauswahlMenue.AngezeigteKarten.Length - 1
                    If I < Karten.Length Then
                        ObjektKartenauswahlMenue.AngezeigteKarten(I) = I
                    Else
                        ObjektKartenauswahlMenue.AngezeigteKarten(I) = 0
                    End If
                Next
                If SiegDurchMensch() Then
                    If SiegerTeam = "q" Then
                        If My.Computer.FileSystem.FileExists(DieseKarte) Then

                            Using Stream As New IO.FileStream(DieseKarte, IO.FileMode.Open, IO.FileAccess.Read)
                                Dim Konverter As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
                                Try
                                    M.SpielKarten(0) = DirectCast(Konverter.Deserialize(Stream), ObjektSpielfeld)
                                Catch
                                    Stream.Close()
                                    M.SpielKarten(0) = LoadMap(DieseKarte) 'New Mapformat
                                End Try
                            End Using

                            M.Kartenname(0) = DieseKarte
                            ObjektKartenauswahlMenue.KartenNamen(0) = M.SpielKarten(0).Kartenname
                        Else
                            Konsole.Write("Couldn't locate last played Map.")
                            Hauptmenue.Ini(Hauptmenue.Formmodi.Hauptmenue)
                        End If
                    Else
                        For I = 0 To Karten.Length - 1
                            If My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "Maps\" + Karten(I) + ".map") Then
                                Using Stream As New IO.FileStream(DataSettings.Resourcenpfad + "Maps\" + Karten(I) + ".map", IO.FileMode.Open, IO.FileAccess.Read)
                                    Dim Konverter As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter

                                    M.SpielKarten(I) = DirectCast(Konverter.Deserialize(Stream), ObjektSpielfeld)
                                End Using
                                M.Kartenname(I) = DataSettings.Resourcenpfad + "Maps\" + Karten(I) + ".map"
                                ObjektKartenauswahlMenue.KartenNamen(I) = M.SpielKarten(I).Kartenname
                            End If
                        Next
                        Dim I2 As Integer = 0
                        While I2 < M.SpielKarten.Length - 1
                            If M.SpielKarten(I2) Is Nothing Then
                                M.SpielKarten(I2) = M.SpielKarten(M.SpielKarten.Length - 1)
                                M.Kartenname(I2) = M.Kartenname(M.Kartenname.Length - 1)
                                ObjektKartenauswahlMenue.KartenNamen(I2) = ObjektKartenauswahlMenue.KartenNamen(ObjektKartenauswahlMenue.KartenNamen.Length - 1)
                                Array.Resize(M.Kartenname, Karten.Length) 'Der Pfad , Endung und so.
                                Array.Resize(ObjektKartenauswahlMenue.KartenNamen, Karten.Length - 1)
                                Array.Resize(M.SpielKarten, M.SpielKarten.Length - 1)
                            Else
                                I2 += 1
                            End If
                        End While
                        If M.SpielKarten.Length <= 0 Then
                            If LandschaftenInfo IsNot Nothing Then
                                Hauptmenue.IniLandkartenMenue(LandschaftenInfo)
                            Else
                                'es gibt keine Folgekarte zurueck zum Hauptmenue
                                Hauptmenue.Ini(Hauptmenue.Formmodi.Hauptmenue)
                            End If
                        Else
                            M.MinimapAktualisieren()
                        End If
                    End If

                ElseIf LandschaftenInfo IsNot Nothing Then
                    Hauptmenue.IniLandkartenMenue(LandschaftenInfo)
                Else
                    If My.Computer.FileSystem.FileExists(DieseKarte) Then
                        Using Stream As New IO.FileStream(DieseKarte, IO.FileMode.Open, IO.FileAccess.Read)
                            Dim Konverter As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
                            Try
                                M.SpielKarten(0) = DirectCast(Konverter.Deserialize(Stream), ObjektSpielfeld)
                            Catch
                                Stream.Close()
                                M.SpielKarten(0) = LoadMap(DieseKarte)
                            End Try

                        End Using
                        M.Kartenname(0) = DieseKarte
                        ObjektKartenauswahlMenue.KartenNamen(0) = M.SpielKarten(0).Kartenname
                    Else
                        Konsole.Write("Couldn't locate last played Map.")
                        Hauptmenue.Ini(Hauptmenue.Formmodi.Hauptmenue)
                    End If
                End If
            Else
                'es gibt keine Folgekarte zurueck zum Hauptmenue
                Hauptmenue.Ini(Hauptmenue.Formmodi.Hauptmenue)
            End If
        ElseIf LandschaftenInfo IsNot Nothing Then
            Hauptmenue.IniLandkartenMenue(LandschaftenInfo)
        Else

            'es gibt keine Folgekarte zurueck zum Hauptmenue
            Hauptmenue.Ini(Hauptmenue.Formmodi.Hauptmenue)
        End If

    End Sub

    Public Overrides Sub Malen()
        Dim BereitsGemalt As Boolean = True
        If AktuelleGrafik < AufzeichnungsTypen.Sieger Then
            If Grafiken(AktuelleGrafik).Malen() = True Then
                If AktuelleGrafik < AufzeichnungsTypen.Spielerstaerke Then
                    If AktuelleGrafik < AufzeichnungsTypen.Spielerstaerke Then
                        AktuelleGrafik += 1

                        BereitsGemalt = False
                    End If
                ElseIf AktuelleGrafik = AufzeichnungsTypen.Spielerstaerke And SiegerTeam <> "q" Then
                    AktuelleGrafik += 1

                    BereitsGemalt = False
                End If
            End If
            'Damit wir fluessige Bilder erhalten.
            Select Case AktuelleGrafik
                Case AufzeichnungsTypen.Sieger
                    DrawSieger()
                Case AufzeichnungsTypen.Sonstiges
                    DrawSonstiges()
            End Select
        Else
            Select Case AktuelleGrafik
                Case AufzeichnungsTypen.Sieger
                    DrawSieger()
                Case AufzeichnungsTypen.Sonstiges
                    DrawSonstiges()


            End Select
        End If
        Select Case AktuelleGrafik
            Case AufzeichnungsTypen.Sieger, AufzeichnungsTypen.Sonstiges
                MyBase.Panels(MyBase.Panels.Length - 1).Visible = False
            Case Else
                MyBase.Panels(MyBase.Panels.Length - 1).Visible = True
        End Select
        Dim Groesse As Integer = 2
        Dim Text As String = Sprachconverter.Translate(AktuelleGrafik.ToString)
        'Jetzt Malen wir eine Ueberschrift.
        Dim P As New Point(DataSettings.BildschirmBreite / 2 - (ObjektAlphabet.BuchstabenBreite * Groesse * Text.Length / 2), (50 - ObjektAlphabet.BuchstabenHoehe * Groesse / 2))
        ObjektAlphabet.DrawString(Text, 1, P, 2)

        MyBase.ObjekteMalen()
        For Each CB In CBBoxes
            CB.Malen()
        Next
    End Sub
    ''' <summary>
    ''' Malt den Sieg Bildschirm mit Sieger KO's
    ''' und verlierer KO's
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub DrawSieger()
        Dim sngrotation As Single = 0
        Dim intcolor As Color = Color.FromArgb(255, 255, 255, 255)
        Grafikengine.szfScale = Nothing
        Grafikengine.recBild = Nothing
        Grafikengine.ptfRotCenter = New Point

        Dim Y As Integer = 140
        For Each Player In MitSpieler
            If Player.Spieler > 0 Then
                Grafikengine.ptfPosition.Y = Y
                If Player.Team = SiegerTeam Then
                    Grafikengine.szfScale = Nothing
                    Grafikengine.recBild = Nothing
                    For I = 0 To DataSettings.BildschirmBreite / 100 + 1
                        Grafikengine.ptfPosition.X = I * 100
                        Grafikengine.Sprite.Draw2D(TexturenHalter.GetSiegMenueSiegerTextur, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngrotation, Grafikengine.ptfPosition, intcolor)
                    Next
                    For I = 0 To 1
                        If Not Player.KOS(I) Is Nothing Then
                            Objektverwalter.GetKO(Player.KOS(I).Bild).KOGesichtsausdruckMalen(1, I * 52 + 5, Y)
                            'So jetzt noch der Siegsatz
                            Text.neuerText(New String() {Objektverwalter.GetKO(Player.KOS(I).Bild).KOBeschreibung.Siegsaetze(SiegTexte(Player.Spieler, I))}, 48 * 2 + 10, Y + 2 + I * 20, Nothing)
                            Schriftengine.DrawText(Text, New Point)
                        End If
                    Next
                Else
                    Grafikengine.szfScale = Nothing
                    Grafikengine.recBild = Nothing
                    For I = 0 To DataSettings.BildschirmBreite / 100 + 1
                        Grafikengine.ptfPosition.X = I * 100
                        Grafikengine.Sprite.Draw2D(TexturenHalter.GetSiegMenueVerliererTextur, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngrotation, Grafikengine.ptfPosition, intcolor)
                    Next
                    For I = 0 To 1
                        If Not Player.KOS(I) Is Nothing Then
                            Objektverwalter.GetKO(Player.KOS(I).Bild).KOGesichtsausdruckMalen(2, I * 52 + 5, Y)
                            Text.neuerText(New String() {Objektverwalter.GetKO(Player.KOS(I).Bild).KOBeschreibung.Niederlagesaetze(SiegTexte(Player.Spieler, I))}, 48 * 2 + 10, Y + 2 + I * 20, Nothing)
                            Schriftengine.DrawText(Text, New Point)
                        End If
                    Next
                End If
                Y += 55
            End If
        Next
    End Sub
    ''' <summary>
    ''' Malt das Menue Sonstiges
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub DrawSonstiges()
        Dim sngrotation As Single = 0
        Dim intcolor As Color = Color.FromArgb(255, 255, 255, 255)
        Grafikengine.szfScale = Nothing
        Grafikengine.recBild = Nothing
        Grafikengine.ptfRotCenter = New Point
        Dim Y As Integer = 140
        Dim Spieler As Integer = 1
        For Each Rank In RankPunkte
            Dim Punkte As Integer = Rank.X + Rank.Y + Rank.Z
            Dim SpielerRank As ObjektAufzeichnungen.Rang = ObjektAufzeichnungen.GetRank(Punkte)
            Dim T As String = Sprachconverter.Translate("Spieler") + " " + Spieler.ToString + "   "
            Dim PunkteNow As Integer = RankTimer
            If Rank.X < RankTimer Then
                PunkteNow = Rank.X
            End If
            T += Sprachconverter.Translate("Tempo") + " :" + PunkteNow.ToString + "   "
            PunkteNow = RankTimer
            If Rank.Y < RankTimer Then
                PunkteNow = Rank.Y
            End If
            T += Sprachconverter.Translate("Kraft") + " :" + PunkteNow.ToString + "   "
            PunkteNow = RankTimer
            If Rank.Z < RankTimer Then
                PunkteNow = Rank.Z
            End If
            T += Sprachconverter.Translate("Technik") + " :" + PunkteNow.ToString + "   "
            ObjektAlphabet.DrawString(T, 1, New Point(30, Y), 0)
            If Rank.X < RankTimer Then
                If Rank.Y < RankTimer Then
                    If Rank.Z < RankTimer Then
                        Grafikengine.ptfPosition.X = 50 + T.Length * Hauptmenue.FeldbreiteKlein
                        Grafikengine.ptfPosition.Y = Y
                        Grafikengine.szfScale = Nothing
                        Grafikengine.recBild = Nothing
                        Grafikengine.ptfRotCenter = New Point
                        Grafikengine.Sprite.Draw2D(TexturenHalter.GetRankTextur(SpielerRank), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngrotation, Grafikengine.ptfPosition, intcolor)
                    End If
                End If
            End If

            Spieler += 1
            Y += 55
        Next
        If RankTimer < 1000 Then
            RankTimer += 1
        End If
    End Sub
    Public Overrides Sub MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        Select Case e.Button
            Case Windows.Forms.MouseButtons.Left
                checkMouseDownObjekte(ObjektMaus.XKoordinate, ObjektMaus.YKoordinate)
                For Each CB In CBBoxes
                    CB.MouseDown(e.X, e.Y)
                Next
        End Select
    End Sub

    Public Overrides Sub MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        MouseMoveObjekte(e.X, e.Y)
    End Sub

    Public Overrides Sub MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        Select Case e.Button
            Case Windows.Forms.MouseButtons.Left
                ButtonGeklicktLinks(checkMouseUPObjekte(ObjektMaus.XKoordinate, ObjektMaus.YKoordinate))
                For Each CB In CBBoxes
                    CB.MouseUp(e.X, e.Y)
                Next
        End Select
    End Sub
    Public Sub ButtonGeklicktLinks(ByVal Effekt As String)
        If Effekt = Nothing Then
            Exit Sub
        End If
        Select Case Effekt.ToLower
            Case "fonds"
                AktuelleGrafik = AufzeichnungsTypen.Fonds
            Case "einkommen"
                AktuelleGrafik = AufzeichnungsTypen.Einkommen
            Case "basen"
                AktuelleGrafik = AufzeichnungsTypen.Basen
            Case "einheiten"
                AktuelleGrafik = AufzeichnungsTypen.Einheiten
            Case "spielerstaerke"
                AktuelleGrafik = AufzeichnungsTypen.Spielerstaerke
            Case "sieger"
                AktuelleGrafik = AufzeichnungsTypen.Sieger
            Case "weiter"
                StatistikenBeenden()
            Case "sonstiges"
                AktuelleGrafik = AufzeichnungsTypen.Sonstiges
        End Select
    End Sub
    Public Overrides Sub MouseWheel(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)

    End Sub

    Public Overrides Sub SetMausBild()
        ObjektMaus.Zustand = ObjektMaus.Zustaende.Menue
    End Sub

    Public Overrides Sub SprachEingabe(ByVal Eingabe As String)

    End Sub


    ''' <summary>
    ''' Diese Klasse zeichnet eine Grafik auf den Bildschirm
    ''' </summary>
    ''' <remarks></remarks>
    Private Class Grafik
        Const UpdateFrame As Integer = 10
        Const XStart As Integer = 300
        Const YStart As Integer = 100
        Dim YMaxTeile As Integer = 0
        Dim XMaxTeile As Integer = 0
        Dim BildHoehe As Integer = DataSettings.BildschirmHoehe - YStart * 2
        Dim Bildbreite As Integer = DataSettings.BildschirmBreite - YStart - XStart
        ''' <summary>
        ''' Hier haben wir zu letzt ein Update gemacht.
        ''' </summary>
        ''' <remarks></remarks>
        Dim MomentaneStelle As Integer = 1
        Dim AufzeichnungsWerte As Integer(,) = {}
        Dim MaximalWert As Integer = 0
        Dim MaximalAnzahl As Integer = 0
        Dim XPlus As Integer = 0
        Dim LetzterTag As Integer = 0
        Dim Frame As Integer = 0
        Public FertigMalen As Boolean = False

        Public Sub UpdateGrafSize()
            BildHoehe = DataSettings.BildschirmHoehe - YStart * 2
            Bildbreite = DataSettings.BildschirmBreite - YStart - XStart
            YMaxTeile = Math.DivRem(BildHoehe, Hauptmenue.FeldbreiteKlein, 0)
            XMaxTeile = Math.DivRem(Bildbreite, Hauptmenue.FeldbreiteKlein, 0)
            Bildbreite = XMaxTeile * Hauptmenue.FeldbreiteKlein
            BildHoehe = YMaxTeile * Hauptmenue.FeldbreiteKlein

            XPlus = Math.DivRem(Bildbreite, AufzeichnungsWerte.GetLength(0), 0)
        End Sub
        Public Sub New(ByVal AufzeichnungsTyp As AufzeichnungsTypen, ByVal Aufzeichnung As ObjektAufzeichnungen)
            LetzterTag = Aufzeichnung.Aufzeichnungen(Aufzeichnung.Aufzeichnungen.Length - 1).SpielerAufzeichnungen(0, 0).Tag
            'Array anpassen
            Dim Spieler1 As Integer = Aufzeichnung.Aufzeichnungen(0).SpielerAufzeichnungen.GetLength(0) - 1
            ReDim AufzeichnungsWerte(Aufzeichnung.Aufzeichnungen.Length * 2 - 1, Aufzeichnung.Aufzeichnungen(0).SpielerAufzeichnungen.GetLength(0) - 1)
            For I = 0 To Aufzeichnung.Aufzeichnungen.Length - 1
                For I2 = 0 To 1
                    Dim Stelle As Integer = I
                    If I > 0 Then Stelle += I
                    If I2 > 0 Then Stelle += 1
                    For Spieler = 0 To Spieler1
                        'Werte auslesen
                        If Not Aufzeichnung.Aufzeichnungen(I).SpielerAufzeichnungen(Spieler, I2) Is Nothing Then
                            Select Case AufzeichnungsTyp
                                Case AufzeichnungsTypen.Basen
                                    AufzeichnungsWerte(Stelle, Spieler) = Aufzeichnung.Aufzeichnungen(I).SpielerAufzeichnungen(Spieler, I2).Basen
                                Case AufzeichnungsTypen.Einheiten
                                    AufzeichnungsWerte(Stelle, Spieler) = Aufzeichnung.Aufzeichnungen(I).SpielerAufzeichnungen(Spieler, I2).Einheiten
                                Case AufzeichnungsTypen.Einkommen
                                    AufzeichnungsWerte(Stelle, Spieler) = Aufzeichnung.Aufzeichnungen(I).SpielerAufzeichnungen(Spieler, I2).Einkommen
                                Case AufzeichnungsTypen.Fonds
                                    AufzeichnungsWerte(Stelle, Spieler) = Aufzeichnung.Aufzeichnungen(I).SpielerAufzeichnungen(Spieler, I2).Fonds
                                Case AufzeichnungsTypen.Spielerstaerke
                                    AufzeichnungsWerte(Stelle, Spieler) = Aufzeichnung.Aufzeichnungen(I).SpielerAufzeichnungen(Spieler, I2).SpielerStaerke
                            End Select
                            If AufzeichnungsWerte(Stelle, Spieler) > MaximalWert Then
                                MaximalWert = AufzeichnungsWerte(Stelle, Spieler)
                            End If
                        Else
                            Select Case AufzeichnungsTyp
                                Case AufzeichnungsTypen.Basen
                                    AufzeichnungsWerte(Stelle, Spieler) = -1
                                Case AufzeichnungsTypen.Einheiten
                                    AufzeichnungsWerte(Stelle, Spieler) = -1
                                Case AufzeichnungsTypen.Einkommen
                                    AufzeichnungsWerte(Stelle, Spieler) = -1
                                Case AufzeichnungsTypen.Fonds
                                    AufzeichnungsWerte(Stelle, Spieler) = -1
                                Case AufzeichnungsTypen.Spielerstaerke
                                    AufzeichnungsWerte(Stelle, Spieler) = -1
                            End Select
                        End If
                    Next
                Next
            Next
            UpdateGrafSize()
            MaximalAnzahl = AufzeichnungsWerte.GetLength(0) - 1
        End Sub
        Public Function Malen() As Boolean
            'You can actually use any number here. but i think 10 looks smart
            If MaximalWert <= 0 Then MaximalWert = ThreadSleepTime

            Grafikengine.fillRect(New Rectangle(XStart, YStart, Bildbreite, BildHoehe), Color.FromArgb(60, 255, 255, 255))

            'End Main Sprite
            Grafikengine.Sprite.End()

            Dim RY As Integer
            Dim XMax As Integer = Math.DivRem(Bildbreite, Hauptmenue.FeldbreiteKlein, RY)
            If RY <> 0 Then XMax += 1
            Dim YMax As Integer = Math.DivRem(BildHoehe, Hauptmenue.FeldbreiteKlein, RY)
            If RY <> 0 Then YMax += 1
            'Gitterlinien malen
            For X1 = 0 To XMax
                Grafikengine.DrawLine(New Vector2(X1 * Hauptmenue.FeldbreiteKlein + XStart, YStart), New Vector2(X1 * Hauptmenue.FeldbreiteKlein + XStart, BildHoehe + YStart), Color.Orange, 1, False)
            Next
            For Y = 0 To YMax
                Grafikengine.DrawLine(New Vector2(XStart, YStart + Y * Hauptmenue.FeldbreiteKlein), New Vector2(Bildbreite + XStart, YStart + Y * Hauptmenue.FeldbreiteKlein), Color.Orange, 1, False)
            Next

            'Wir zeichnen die Y. Striche rein um unseren Wert zuordnen zu koennen.
            Dim YMaxTeile As Integer = Math.DivRem(BildHoehe, Hauptmenue.FeldbreiteKlein, 0)
            Dim XMaxTeile As Integer = Math.DivRem(Bildbreite, Hauptmenue.FeldbreiteKlein, 0)
            Dim Rand As Integer = BildHoehe - YMaxTeile * Hauptmenue.FeldbreiteKlein
            Dim Teiler As Integer = 5
            YMax = Math.DivRem(YMaxTeile, Teiler, 0)
            Dim Y1 As Integer = Rand

            For Y = 0 To YMax
                Grafikengine.DrawLine(New Vector2(XStart, Y1 + YStart), New Vector2(Bildbreite + XStart, Y1 + YStart), Color.Black, 1, False)
                Y1 += Teiler * Hauptmenue.FeldbreiteKlein
            Next

            'Wir zeichnen die X. Striche rein um unseren Wert zuordnen zu koennen.
            Teiler = 5
            Dim Groesse As Single = 1
            Dim LaengsterText As Integer = LetzterTag.ToString.Length * Groesse * ObjektAlphabet.BuchstabenBreite
            While LaengsterText > Teiler * Hauptmenue.FeldbreiteKlein
                Teiler += 5
            End While
            YMax = Math.DivRem(XMaxTeile, Teiler, 0)
            For X1 = 1 To YMax
                Y1 = Teiler * Hauptmenue.FeldbreiteKlein * X1
                Grafikengine.DrawLine(New Vector2(Y1 + XStart, YStart), New Vector2(Y1 + XStart, BildHoehe + YStart), Color.Black, 1, False)
            Next

            For Spieler = 0 To AufzeichnungsWerte.GetLength(1) - 1
                'Should this Player be shown?
                If CType(Objektverwalter.Menue, ObjektSiegMenue).CBBoxes(Spieler).Checked Then
                    Dim Points As New List(Of Vector2)
                    Dim X As Integer = XStart
                    For I = 0 To MomentaneStelle
                        ' I think drawing it on the Bottom is more useful.
                        If AufzeichnungsWerte(I, Spieler) >= 0 Then
                            If MaximalWert > 0 Then
                                Points.Add(New Vector2(X, YStart + BildHoehe - AufzeichnungsWerte(I, Spieler) / MaximalWert * BildHoehe))
                            Else
                                Points.Add(New Vector2(X, YStart + BildHoehe)) '- BildHoehe / 2))
                            End If
                            If I = MaximalAnzahl Then
                                If MaximalWert > 0 Then
                                    Points.Add(New Vector2(XStart + Bildbreite, YStart + BildHoehe - AufzeichnungsWerte(I, Spieler) / MaximalWert * BildHoehe))
                                Else
                                    Points.Add(New Vector2(XStart + Bildbreite, YStart + BildHoehe)) '- BildHoehe / 2))
                                End If
                            End If
                        ElseIf I > 0 Then
                            If AufzeichnungsWerte(I - 1, Spieler) >= 0 Then
                                If MaximalWert > 0 Then
                                    Points.Add(New Vector2(X, YStart + BildHoehe - AufzeichnungsWerte(I - 1, Spieler) / MaximalWert * BildHoehe))
                                Else
                                    Points.Add(New Vector2(X, YStart + BildHoehe - BildHoehe / 2))
                                End If
                            End If
                        End If
                        X += XPlus
                    Next
                    Grafikengine.DrawLine(Points.ToArray, ObjektSiegMenue.Farbtabellen(Spieler), 3, False)
                End If
            Next
            'Launch 2D Sprite
            Grafikengine.Sprite.Begin(SpriteFlags.AlphaBlend)

            Dim sngrotation As Single = 0
            Dim intcolor As Color = Color.FromArgb(255, 255, 255, 255)
            Grafikengine.szfScale = Nothing
            Grafikengine.ptfRotCenter = New Point
            Grafikengine.recBild = Nothing
            Grafikengine.ptfPosition = New Point(100 + XStart, 100)
            Grafikengine.szfScale = Nothing
            Grafikengine.ptfRotCenter = New Point
            Grafikengine.recBild = Nothing

            DrawAchsenBeschriftung()



            For Spieler = 0 To AufzeichnungsWerte.GetLength(1) - 1
                If CType(Objektverwalter.Menue, ObjektSiegMenue).CBBoxes(Spieler).Checked Then
                    For I = 0 To ObjektSiegMenue.BesondereEreignisse.Length - 1
                        If ObjektSiegMenue.BesondereEreignisse(I).Spieler - 1 = Spieler Then
                            Dim Pic As Integer = 0
                            Select Case ObjektSiegMenue.BesondereEreignisse(I).Ereignis
                                Case BesonderesEreigniss.Ereignisse.Gabe
                                    Pic = 0
                                Case BesonderesEreigniss.Ereignisse.Spezialgabe
                                    Pic = 1
                                Case BesonderesEreigniss.Ereignisse.Doppelgabe
                                    Pic = 2
                                Case BesonderesEreigniss.Ereignisse.HQEroberung
                                    Pic = 3
                                Case BesonderesEreigniss.Ereignisse.HQVerlust
                                    Pic = 4
                                Case Else
                                    Pic = 0
                            End Select
                            Dim YWert As Integer = 0
                            Dim Tag As Integer = ObjektSiegMenue.BesondereEreignisse(I).Tag * 2
                            If Tag <= MomentaneStelle Then
                                If MaximalWert > 0 Then
                                    YWert = YStart + BildHoehe - AufzeichnungsWerte(Tag, Spieler) / MaximalWert * BildHoehe
                                Else
                                    YWert = YStart + BildHoehe - BildHoehe / 2
                                End If
                                Grafikengine.Draw2D(CType(Objektverwalter.Menue, ObjektSiegMenue).SpecialEventTexturs(Pic), New Point(XStart + Tag * XPlus - Hauptmenue.FeldbreiteKlein / 2, YWert - Hauptmenue.FeldbreiteKlein / 2), Nothing, Nothing, 0, Color.FromArgb(255, 255, 255, 255))
                            End If
                        End If
                    Next
                    For I = 0 To MomentaneStelle
                        Dim Pic As Integer = 5
                        Dim YWert As Integer = 0
                        Dim DrawLoose As Boolean = False
                        If AufzeichnungsWerte(I, Spieler) < 0 Then
                            If I - 1 >= 0 Then
                                If AufzeichnungsWerte(I - 1, Spieler) >= 0 Then
                                    If MaximalWert > 0 Then
                                        YWert = YStart + BildHoehe - AufzeichnungsWerte(I - 1, Spieler) / MaximalWert * BildHoehe
                                    Else
                                        YWert = YStart + BildHoehe - BildHoehe / 2
                                    End If
                                    DrawLoose = True
                                End If
                            Else
                                'Niederlagensymbol malen
                                If MaximalWert > 0 Then
                                    If AufzeichnungsWerte(I, Spieler) > 0 Then
                                        YWert = YStart + BildHoehe - AufzeichnungsWerte(I, Spieler) / MaximalWert * BildHoehe
                                    Else
                                        YWert = YStart + BildHoehe
                                    End If
                                Else
                                    YWert = YStart + BildHoehe - BildHoehe / 2
                                End If
                                DrawLoose = True
                            End If
                        End If
                        If DrawLoose Then
                            Grafikengine.Draw2D(CType(Objektverwalter.Menue, ObjektSiegMenue).SpecialEventTexturs(Pic), New Point(XStart + I * XPlus - Hauptmenue.FeldbreiteKlein / 2, YWert - Hauptmenue.FeldbreiteKlein / 2), Nothing, Nothing, 0, Color.FromArgb(255, 255, 255, 255))
                            Exit For
                        End If
                    Next
                End If
            Next

            Frame += 1
            If Frame > UpdateFrame And MaximalAnzahl = MomentaneStelle Then
                If Not FertigMalen Then
                    FertigMalen = True
                    Return True
                End If
            ElseIf FertigMalen Then
                MomentaneStelle = MaximalAnzahl
            ElseIf Frame > UpdateFrame Then
                Frame = 0
                MomentaneStelle += 1
                If MomentaneStelle > MaximalAnzahl Then
                    MomentaneStelle = MaximalAnzahl
                End If
            End If
            Return False
        End Function
        Private Sub DrawAchsenBeschriftung()




            'Y-Achse
            Dim Teiler As Integer = 5
            Dim Rand As Integer = BildHoehe - YMaxTeile * Hauptmenue.FeldbreiteKlein
            Dim YMax As Integer = Math.DivRem(YMaxTeile, Teiler, 0)
            Dim Steps As Single = MaximalWert / YMaxTeile

            Dim Groesse As Single = 1
            Dim P As New Point(0, YStart + Rand - (Groesse * ObjektAlphabet.BuchstabenHoehe) / 2)
            For Y = 0 To YMax
                Dim Wert As String = CInt((MaximalWert - Steps * Y * Teiler)).ToString

                P.X = XStart - Wert.Length * ObjektAlphabet.BuchstabenBreite * Groesse - 5

                ObjektAlphabet.DrawString(Wert, Groesse, P, 0)
                'Fuenf, weil wir nur jedes fuenfte Kaestschen beschriften. 16 die Hoehe eines Kaestchens
                P.Y += Teiler * Hauptmenue.FeldbreiteKlein
            Next
            Teiler = 5
            'X-Achse
            Dim LaengsterText As Integer = LetzterTag.ToString.Length * Groesse * ObjektAlphabet.BuchstabenBreite
            While LaengsterText > Teiler * Hauptmenue.FeldbreiteKlein
                Teiler += 5
            End While
            YMax = Math.DivRem(XMaxTeile, Teiler, 0)
            P = New Point(XStart, YStart + BildHoehe + 10)
            Steps = LetzterTag / XMaxTeile
            For X = 1 To YMax
                Dim Wert As String = CInt((Steps * X * Teiler)).ToString
                P.X = (XStart + X * Teiler * Hauptmenue.FeldbreiteKlein - Wert.Length * Groesse * ObjektAlphabet.BuchstabenBreite / 2)
                ObjektAlphabet.DrawString(Wert, Groesse, P, 0)
            Next
        End Sub
    End Class
    Public Overrides Sub Reset()
        For Each T In SpecialEventTexturs
            T.Dispose()
        Next
        Dim I2 As Integer = Objektverwalter.GetKOLength()
        While Objektverwalter.GetKO(I2 - 1).KOID.StartsWith("CLONE")
            I2 -= 1
        End While
        Objektverwalter.DeleteKOS(I2)
    End Sub

    Public Overrides Sub KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)

    End Sub
End Class
